package com.zlzlib.libnetty.listener;


import com.zlzlib.libnetty.msg.MsgDispatcher;
import com.zlzlib.libnetty.msg.MsgTimeoutTimerManager;

import java.util.Vector;

/**
 * Created by zlz on 2019/11/18.
 * 抽象接口，需要切换到其它方式实现im功能，实现此接口即可
 */
public interface NettyClientInterface<T> {
    /**
     * 初始化
     *
     * @param serverUrlList 服务器地址列表
     * @param listener      与应用层交互的listener
     * @param callback      im连接状态回调
     * @param dataListener  im数据转化的方法
     */
    void init(Vector<String> serverUrlList, NettyEvenListener<T> listener, NettyConnectStateListener callback, NettyDataListener<T> dataListener);

    /**
     * 重置连接，也就是重连
     * 首次连接也可认为是重连  会在当前线程等待 请使用子线程启动
     */
    void resetConnect();

    /**
     * 重置连接，也就是重连
     * 首次连接也可认为是重连
     *
     * @param isFirst 是否首次连接     为false时会在当前线程等待  请使用子线程启动
     */
    void resetConnect(boolean isFirst);

    /**
     * 关闭连接，同时释放资源
     */
    void close();

    /**
     * @return 标识im是否已关闭
     */
    boolean isClosed();

    /**
     * @param msg 发送消息
     */
    void sendMsg(T msg);

    /**
     * @param msg                  发送消息
     * @param isJoinTimeoutManager 是否加入发送超时管理器
     */
    void sendMsg(T msg, boolean isJoinTimeoutManager);

    /**
     * @return 获取重连间隔时长
     */
    int getReconnectInterval();

    /**
     * @return 获取连接超时时长
     */
    int getConnectTimeout();

    /**
     * @return 获取应用在前台时心跳间隔时间
     */
    int getForegroundHeartbeatInterval();

    /**
     * @return 获取应用在后台时心跳间隔时间
     */
    int getBackgroundHeartbeatInterval();

    /**
     * 设置app在前台
     */
    void setAppForeground();

    /**
     * 设置app在后台
     */
    void setAppBackground();

    /**
     * @return app是否在前台
     */
    boolean isAppForeground();

    /**
     * @return 获取应用层消息发送超时重发次数
     */
    int getResendCount();

    /**
     * @return 获取应用层消息发送超时重发间隔
     */
    int getResendInterval();

    /**
     * @return 获取消息转发器
     */
    MsgDispatcher<T> getMsgDispatcher();

    /**
     * @return 获取消息发送超时定时器
     */
    MsgTimeoutTimerManager<T> getMsgTimeoutTimerManager();

    /**
     * @return 获取消息转化器
     */
    NettyDataListener<T> getDataListener();

    /**
     * @return 服务是否存活
     */
    boolean isAlive();

    String getHost();

    int getPort();

    String getUrl();
}
